home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d1
/
lb_v114.arc
/
LASTBYTE.DOC
< prev
next >
Wrap
Text File
|
1990-11-30
|
65KB
|
1,442 lines
THE LAST BYTE (tm)
A DOS Memory Manager for Chips & Technologies Motherboards
Version 1.14
Revised: October 24, 1990
Copyright (C) 1990
All Rights Reserved
by
KEY SOFTWARE PRODUCTS
440 Ninth Avenue
Menlo Park, California 94025
(415) 364-9847
Prodigy E-Mail Address: VGDC59A
E-Mail on Internet, Bitnet, etc: DLEWIS@SCU.BITNET
CompuServe E-Mail Address: >Internet:DLEWIS@SCU.BITNET
Oct 24, 1990 The LAST BYTE (tm) 1
_1_.__I_n_t_r_o_d_u_c_t_i_o_n________
LASTBYTE is a collection of software that can make up to 384k
more memory available to your 286, 386, or 386SX machine by
taking advantage of those motherboards that use one of the
following memory controller chips manufactured by Chips and
Technologies:
82C302 - Used with 386 Systems without a Cache
82C307 - Used with 386 Systems with a Cache
82C212 - Part of the NEAT Chipset for 286 and 386
82C812 - Part of the NEAT Chipset for 386SX
LASTBYTE does this by using the 384k of high memory (in the
640k-1MB range) that is on your motherboard but which is
normally only used for Shadow RAM.
With LASTBYTE, this memory can also be used for TSR's, TSR
markers (to facilitate TSR removal), device drivers, DOS
Buffers, RAM disks, and Emulated Expanded Memory rather than
loading all of these into conventional memory (0-640k) where
they use precious DOS memory space needed by your application
programs. If you don't have an EGA or VGA, or if you don't use
graphics, then conventional memory (available to application
programs) can be extended from 640k to as much as 736k.
Other system requirements: DOS 3.0 or higher, 1M or more of
(physical) memory.
Important Differences
LASTBYTE has five significant advantages over other DOS Memory
Managers:
o LASTBYTE doesn't require a 386. Most other DOS
memory managers won't work on 286 systems. The
only hardware required by LASTBYTE is the Chips and
Technology chipset and 1MB of hardware.
o LASTBYTE doesn't use any 386 protected mode
software. This means that unlike some other DOS
memory managers, LASTBYTE works well with Microsoft
Windows/386 and Windows 3.0.
o LASTBYTE doesn't require any extended memory (above
1MB). Other DOS memory managers depend on the 386
processor's ability to remap physical memory from
above 1MB into high memory, but of course that
memory is no longer available as extended memory.
LASTBYTE uses the memory you already have sitting
between 640k and 1Meg.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 2
o LASTBYTE, unlike all other DOS memory managers, can
use the high memory addresses that coincide with
the Display Buffer, Bios ROM or any adapter that
you have installed. LASTBYTE uses a
"Bank-Switching" technique to use this memory as a
Ram Disk, as Expanded Memory, and to hold TSR
"markers" to facilitate TSR removal. This gives
LASTBYTE the unique ability to use *ALL* 384k of
high memory!
o LASTBYTE does not slow down the performance of your
computer, both because it does not incur the
instruction execution inherent in 386 protected
mode, and because it uses regular (full-speed)
memory. (Some memory managers use the actual
EGA/VGA graphics buffer as DOS memory, but the
display buffer memory of some EGA/VGA adapter cards
can be as much as six times slower than regular
memory.)
_2_.__I_n_s_t_a_l_l_a_t_i_o_n________
You should first install LASTBYTE on a floppy to verify that you
can boot and operate your PC reliably with LASTBYTE installed:
Step 1: Use the FORMAT command with the /S option to
prepare a bootable floppy disk.
Step 2: Copy all (it's easier) of the LASTBYTE files
onto the diskette. (Actually, all you need
are LASTBYTE.SYS, HIGHDRVR.SYS, HIGHTSR.EXE,
HIGHMEM.EXE, HIGHMARK.EXE, HIGHUNDO.EXE,
CLOCK.EXE, COLS.40, and COLS.80.)
Step 3: Copy the DOS device driver file ANSI.SYS onto
the diskette.
Step 4: Create a CONFIG.SYS file on the floppy that
contains the lines:
DEVICE=LASTBYTE.SYS ?
DEVICE=HIGHDRVR.SYS ANSI.SYS
The "?" in the first line is intentional - it
directs LASTBYTE to display what it finds in
the high memory address space.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 3
Step 5: Create an AUTOEXEC.BAT file on the floppy that
contains the lines:
HIGHMARK
HIGHTSR CLOCK
Step 6: Boot from the floppy. (Note: NEAT chipsets on
286 and 386sx motherboards with only 1 Meg of
physical memory provide a setup option to use
the 384k as Extended Memory by relocating it
just above the 1 Meg boundary. This option
is incompatible with LASTBYTE and must be
disabled in the CMOS Setup Configuration
Menu.)
If everything goes ok, you'll see a sign-on box that looks
something like the following:
╔═══════════════════════════════════════════════════════════════════╗
║ The Last Byte v1.14f - Licensed for EVALUATION ONLY ║
║ Copyright (C) 1990, Key Software Products, All Rights Reserved ║
╟───────────────────────────────────────────────────────────────────╢
║ Memory locations A0000-BFFFF (128k) are VGA Display RAM. ║
║ Memory locations C0000-C7FFF ( 32k) are ROM Bios Code. ║
║ Memory locations C8000-CB7FF ( 14k) are Adapter Rom. ║
║ Memory locations CB800-CBFFF ( 2k) are Adapter Ram. ║
║ Memory locations F0000-FFFFF ( 64k) are ROM Bios Code. ║
╟───────────────────────────────────────────────────────────────────╢
║ Conventional High-DOS Bank-Switch Shadow-Ram Excluded ║
║ 640k 32k 32k 96k 224k ║
╚═══════════════════════════════════════════════════════════════════╝
If your PC stops before displaying the entire box shown above,
or if it fails to operate properly after booting, this is
because LASTBYTE failed to identify one of your installed
adapters that uses some portion of the high-memory address
space. If this happens, you'll probably need to use the
"EXCLUDE=" command line option (discussed below) to manually
disable the corresponding region(s) where conflict occurs. To
temporarily get around this problem, you can manually abort all
LASTBYTE device drivers and TSR's by simultaneously holding down
the <left shift>, <alt>, and <ctrl> keys during the boot
sequence.
After AUTOEXEC.BAT is finished, you'll see the current time
displayed in inverse video in the upper left-hand corner of your
screen. This verifies that HIGHTSR has succesfully loaded the
CLOCK.EXE into high memory. You can verify that ANSI.SYS is
installed and operating by using the commands:
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 4
TYPE COLS.40
{switches display to 25 rows by 40 columns}, or
TYPE COLS.80
{switches display to 25 rows by 80 columns}.
(These commands will display garbage on the screen if ANSI.SYS
has not been installed.)
Now run HIGHMEM to get a map of high memory. Depending on what
adapter cards you have installed, HIGHMEM's output should look
something like this:
HIGHMEM v1.14e (C) Key Software Products 1990. All Rights Reserved.
MCB Address Range Description High-DOS Bnk-Swtch Total Mark
──── ───────────── ──────────────── ──────── ───────── ─────── ────
C400 ┌ A0000-C3FFF <Wrap Block>
C402 ├─ A0000-A7FFF VGA Display Ram [ 32,768] 32,768
C404 ├─ A8000-BFFFF VGA Display Ram 98,304
C406 └─ C0000-C3FFF Shadow Ram 16,384 16,384
C408 C4090-C467F LASTBYTE.SYS 1,520 1,520
C468 C4690-C46CF CLOCK.EXE [Env] 64 64
C46D C46E0-C488F CLOCK.EXE 432 432
C489 C48A0-C7FDF ....DOS Free [ 14,144] 14,144
C7FE ┌ C8000-CBFFF <Wrap Block>
CC00 ├─ C8000-C97FF Adapter Rom 6,144
CC02 ├─ C9800-C9FFF Adapter Ram 2,048
CC04 └─ CA000-CBFFF DOS Unusable 8,192
CC06 CC070-CD1EF ANSI.SYS 4,480 4,480
CD1F CD200-CFF9F ....DOS Free [ 11,680] 11,680
CFFE ┌ D0000-FFFFF <Wrap Block>
CFFA ├─ D0000-EFFFF Excluded Block 131,072
CFFC └─ F0000-FFFFF Shadow Ram 65,536 65,536
─────── ─────── ───────
High Memory In Use: 6,496 81,920 334,176
[Free High Memory]: 25,824 32,768 58,592
MCB Overhead: 192 256 448
─────── ─────── ───────
Total High Memory: 32,512 114,944 393,216
Paging the output of HIGHMEM
You may use the "/Page" (or simply "/P") option of
HIGHMEM to force the output to pause after each screen
full.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 5
This listing is for a PC that has an EGA display adapter and a
SCSI hard disk adapter. The "Shadow Ram" at C0000-C3FFF is the
EGA Bios and the "Adapter Rom" and "Adapter Ram" are on the SCSI
adapter card. The "DOS Unusable" region exists because of the
16k resolution of the Chips and Technologies memory controller.
On a more typical machine (without a SCSI hard disk), the entire
16k region from C8000-CBFFF would be available for device
drivers and TSR's.
The column labelled "Bnk-Swtch" shows which entries can be used
as Bank-Switch memory for Ramdisk, emulated EMS memory, or TSR
markers.
Numbers enclosed in brackets (e.g., "[ 14,144]") refer to memory
that is available for use. Once you have licensed your copy of
LASTBYTE, the "Excluded Block" shown above would be added to the
free High-DOS memory pool, and the second entry labelled "EGA
Display Ram" would be added to the free Bank-Switch memory
pool. That means a total of approximately 160k of memory
available for device drivers and TSR's and another 128k for Ram
Disks, TSR markers, or emulated EMS memory. (Sections 11, 12,
and 14 explain how you may even be able to increase the 160k
figure to 224k or even 288k.)
The column labelled "Mark" is used in conjunction with HIGHMARK
and HIGHUNDO. In particular, you may have wondered why the
command HIGHMARK was included in the AUTOEXEC.BAT file. Since
it was executed before running HIGHTSR CLOCK, you are now able
to remove the clock from memory by simply running HIGHUNDO. Try
it!
_3_.__C_o_m_m_a_n_d__L_i_n_e__O_p_t_i_o_n_s__F_o_r__L_A_S_T_B_Y_T_E_._S_Y_S____
During initialization, LASTBYTE.SYS scans high memory looking
for Bios ROMs, Display Ram, and Adapter Cards that occupy the
640k-1M address space. The unoccupied portion of high memory
defaults to High-DOS memory (for device drivers and TSR's),
while the occupied portion defaults to Bank-Switch memory that
can be made accessible for Ram disks, emulated EMS memory, etc.
These defaults can be modified by the use of command line
options. There are four command line options for LASTBYTE.SYS
(you may abbreviate any of these by using only the first
letter):
DOS (Abbreviated "D")
Forces a region of high memory that would
normally be used as Bank-Switch memory to be made
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 6
available as High-DOS memory.
BSW (Abbreviated "B")
Forces a region of high memory that would
normally be used as High-DOS memory to be made
available as Bank-Switch memory.
EXCLUDE (Abbreviated "E")
Forces a region of high memory to not be
available either as High-DOS or as Bank-Switch
memory.
APPEND (Abbreviated "A")
Reserves a region of high memory for appending to
the end of DOS low (conventional) memory, thus
increasing it beyond 640k. The memory is NOT
added until it is enabled with HIGHAPND.
Requires setting "<base>" (see below) to A000,
and "<size>" to a multiple of 16k. (Note:
"<size>" is limited to 16k in the unlicensed
version so that some High DOS memory will still
be available.)
? (A question mark)
Causes LASTBYTE.SYS to display a summary of what
it finds in the High Memory address space.
The format of the APPEND, DOS, BSW, and EXCLUDE options is:
<keyword>=<base>:<size>
where "<base>" is a base paragraph (segment) address expressed
as four hexadecimal digits, and "<size>" is kilobytes expressed
in decimal. For example, to force the 64k address range
starting at segment A000 to be used as Bank-Switch memory, the
proper option syntax would be:
BSW=A000:64
(Examples of why this option can be useful are found in Section
12, "Video Display RAM above 640k".)
In a similar manner, to force LASTBYTE to use the 32k region
starting at segment F000 as High-DOS Memory, the proper option
syntax would be:
DOS=F000:32
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 7
(Examples of why this option can be useful are found in Section
11, "Using the DOS=F000:32 Option with AMI Bios Chips".)
There are two restrictions on these options:
o The base must be exactly 4 hexadecimal digits, must
lie at or above A000, and must be a multiple of
0080 (2k). (For APPEND, the base must always be
A000.)
o The size must be in the range 2-384 kb, and must be
a multiple of 2.
The reason for the "multiple of 2 (kb)" requirement is that
LASTBYTE tries to allocate memory in 2k increments,
corresponding to the IBM spec that Bios ROM's are sized in
multiples of 2kb. However, this is somewhat complicated by the
coarse 16k resolution of the Chips and Technology memory
controllers:
The Chips and Technologies memory controller chips divide the
640k-1M area into 24 blocks of 16k each. Each 16k block must be
either totally enabled or disabled. I.e., if any part of a 16k
address space is occupied by an adapter card, the entire 16k
block of memory must be disabled and cannot be made available as
High DOS Memory. Thus the "DOS=" option restricts "<size>" to
multiples of 16, and "<base>" to addresses that begin on 16k
boundaries.
Once you are convinced that LASTBYTE is working satisfactorily,
you may copy it to your hard disk and modify the CONFIG.SYS and
AUTOEXEC.BAT files there accordingly.
_4_.__H_I_G_H_M_A_R_K__a_n_d__H_I_G_H_U_N_D_O_:__U_n_l_o_a_d_i_n_g__T_S_R_s__f_r_o_m__M_e_m_o_r_y__
Sometimes it can be useful to remove one or more TSR's from
memory, either because you no longer want to use the features
that they provide or perhaps in order to make room for another
set of TSR's.
In order to be able to remove a group of TSR's from high memory,
they must be be marked. To mark them, run HIGHMARK once before
you use HIGHTSR to load the TSR's. Then later, simply run
HIGHUNDO - the mark and all of its assoicated TSR's will be
removed.
HIGHMARK may be executed more than once to establish levels of
TSR's to be removed. Each execution of HIGHMARK places another
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 8
mark in memory with a unique mark number. Every TSR loaded by
HIGHTSR is automatically associated with the most recent
execution of HIGHMARK. You can use HIGHMEM to see the marks,
their mark number, and the set of TSR's associated with the
mark. Every execution of HIGHUNDO will then remove the set of
TSR's associated with the most recent HIGHMARK.
You may specify a mark level on the command line of HIGHMARK.
This will cause it to remove all the TSR's and marks whose mark
number is greater than or equal to the number on the command
line.
_5_.__H_I_G_H_I_N_S_T_:__L_o_a_d_i_n_g__S_H_A_R_E_._E_X_E__i_n_t_o__H_i_g_h__M_e_m_o_r_y___
DOS 4 now installs the SHARE program automatically if you have a
hard disk which is greater than 32 MB in a single partition. It
does this without asking because otherwise it is possible to
corrupt the data on the disk when running programs that use the
old File Control Block (FCB) approach to access files.
Unfortunately, some internal parts of DOS still use FCB's! So
don't try to prevent SHARE from being loaded by removing it from
your system! If DOS can't find it, you'll get a warning message
during the boot saying that "SHARE should be loaded for large
media". You could load it during AUTOEXEC.BAT processing, but
you'll still get the warning because the check occurs during
CONFIG.SYS processing.
So how can you load this TSR into High Memory without getting
the warning? DOS recently introduced the "INSTALL=" directive
that allows TSR's to be installed during CONFIG.SYS processing.
Programs that Microsoft suggests be loaded in this manner
include FASTOPEN, KEYB, NLSFUNC, and SHARE. For example:
INSTALL=C:\DOS\SHARE.EXE
However, the above command causes SHARE to be loaded down in
Conventional Memory. To get it into High Memory, use:
INSTALL=HIGHINST.EXE C:\DOS\SHARE.EXE
HIGHTSR works too, but you get an error message about the above
line in CONFIG.SYS. This is because the DOS expects the name
that immediately follows the equals sign to be a TSR, and
anything else (e.g., HIGHTSR) will cause the error message.
HIGHINST is a copy of HIGHTSR that has been modified to be a TSR
so that this error message can be avoided. Since HIGHINST
itself is a TSR, a small part of it will remain resident down in
Conventional Memory, but only 96 bytes.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 9
_6_.__T_h_e__/_S_I_Z_E__o_p_t_i_o_n__o_f__H_I_G_H_D_R_V_R__H_I_G_H_T_S_R__a_n_d__H_I_G_H_I_N_S_T_
The amount of High-DOS memory required to load a device driver
or TSR (hereafter called the "load requirement") is the larger
of two amounts: (1) the amount required during initialization
(greater than or equal to the size of the file) and (2) the
amount required when finally resident.
Although the final resident requirement of any high-loaded
software may be obtained from the HIGHMEM output, remember that
the initialization (and thus the load) requirement may be
greater than EITHER the file size or the HIGHMEM listing!
Most device drivers and TSR's require more memory for
initialization than when resident, although there are a few
(such as SMARTDRV.SYS and NANSI.SYS) which require extra
resident memory for buffers, etc. And then there's the weird
behavior of FASTOPEN and MODE that require even more than this!
(See section 8, "Installing FASTOPEN and MODE into High
Memory".) Thus the normal operation of HIGHDRVR, HIGHTSR, and
HIGHINST is to use the largest free High-DOS memory block to
load the driver since the resident memory requirement cannot be
determined until after the software has been loaded and
initialized.
Unfortunately, this can lead to a less than optimum use of
memory. If the memory requirements were known, then a memory
block could be selected using a "best fit" strategy; i.e., the
smallest free High-DOS memory block which is larger than or
equal to the load requirement. This usually results in much
better utilization of memory.
HIGHDRVR, HIGHTSR, and HIGHINST have a special option /SIZE that
can be used to report the load requirement:
DEVICE=HIGHDRVR.SYS /SIZE SMARTDRV.SYS 2048 512
or: INSTALL=HIGHINST.EXE /SIZE SHARE.EXE
or: HIGHTSR /SIZE PRINT.COM /D:PRN
The load requirement will then be displayed on the console after
the software has been loaded and initialized. This information
can then be used to specify the value (expressed in bytes) to be
used with the /SIZE option to force a "best fit" allocation.
For example:
DEVICE=HIGHDRVR.SYS /SIZE:16240 SMARTDRV.SYS 2048 512
or: INSTALL=HIGHINST.EXE /SIZE:13616 SHARE.EXE
or: HIGHTSR /SIZE:17120 PRINT.COM /D:PRN
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 10
_7_.__T_h_e__/_N_O_E_N_V__o_p_t_i_o_n__o_f__H_I_G_H_T_S_R__a_n_d__H_I_G_H_I_N_S_T__
All programs, including TSR's, are allocated two regions of
memory when they are loaded: One is the area for the program
itself, and the other is for a copy of the environment. Most
TSR's don't make use of their environment, and some actually
release it to the operating system rather than hanging onto it.
If HIGHMEM finds an environment block, the corresponding entry
in the "Description" column will have the name of the TSR that
it belongs to (such as "CLOCK.EXE") followed by the indication
"[Env]". Occassionally, you may see a similar indication
"[Dat]"; this is a data block explicitly allocated by the TSR
for some unknown purpose.
TSRs that eliminate their PSP
The authors of some TSR's attempt to save a little
extra memory by having the TSR eliminate its own
Program Segment Prefix (PSP) during initialization.
Doing so makes it impossible for HIGHTSR, HIGHINST, or
HIGHMEM to identify the TSR's environment block.
However, this byte-saving mentality will usually mean
that the TSR's initialization code also eliminates its
environment block, so this is rarely a problem.
If you see a block labelled "[Env]" in the output of HIGHMEM,
then you can use the following command line option of HIGHTSR or
HIGHINST to release this memory, even if the TSR didn't:
INSTALL=HIGHINST.EXE /NOENV CLOCK.EXE
or: HIGHTSR /NOENV CLOCK
The /NOENV (and /SIZE) options must PRECEDE the name of the TSR
that is to be loaded high by HIGHTSR or HIGHINST. Case of the
option is insignificant.
_8_.__I_n_s_t_a_l_l_i_n_g__F_A_S_T_O_P_E_N__a_n_d__M_O_D_E__i_n_t_o__H_i_g_h__M_e_m_o_r_y__
The FASTOPEN and MODE programs that comes with DOS are TSR's and
as such may be loaded into high memory with either HIGHTSR or
HIGHINST. Once installed, each requires very little memory,
something on the order of 10k or less. However, neither will
install unless a LOT of memory is available, like around
50-90k. (The actual requirement depends partly on command line
options; you can determine the requirement using the /SIZE
option of HIGHTSR or HIGHINST.)
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 11
The worst part is that if FASTOPEN fails to install itself
successfully, it doesn't issue any error message - it simply
doesn't display the normal "FASTOPEN installed" sign-on
message. Moral: Let FASTOPEN and MODE be the first TSR's that
are installed into High Memory in your AUTOEXEC.BAT file so that
they get access to the maximum amount of memory.
The second hassle with these two TSR's is that they cannot be
removed by using HIGHMARK and HIGHUNDO. Evidently they modify
memory other than that tracked by the LASTBYTE utilities: the
interrupt vector table and that memory allocated to them.
_9_.__H_I_G_H_D_I_S_K_:__A__R_a_m__D_i_s_k__i_n__B_a_n_k_-_S_w_i_t_c_h__M_e_m_o_r_y__
HIGHDISK.SYS is a device driver that uses high memory to
implement a Ram Disk. Bank-Switch Memory is allocated first,
and if that isn't enough, then High-DOS Memory is allocated to
satisfy the total page request. The device driver itself may be
loaded into high memory by using HIGHDRVR.SYS to load
HIGHDISK.SYS.
Minimum Requirement
The amount of available Bank-Switch memory must be
sufficient to hold the Ram Disk's boot sector, one
copy of the FAT, and the directory. Normally this is
not a problem, but may require that HIGHDISK be loaded
before HIGHEMS3 (or HIGHEMS4).
A typical command in CONFIG.SYS might be:
DEVICE=HIGHDRVR.SYS HIGHDISK.SYS
This creates a RAM disk that uses all available High Memory,
with 32 directory entries and sectors of 128 bytes each.
A command line option may be used to change the size of the RAM
disk as in:
DEVICE=HIGHDRVR.SYS HIGHDISK.SYS 100
This creates a 100k byte RAM disk.
Other command line options may be used to change the number of
bytes per sector and directory entries, as in:
DEVICE=HIGHDRVR.SYS HIGHDISK.SYS 100 256 64
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 12
This creates a 100k RAM disk with 256 bytes per sector and 64
root directory entries.
_1_0_.__W_i_n_d_o_w_s__3_._0__C_o_m_p_a_t_i_b_i_l_i_t_y______
In general, LASTBYTE has a high degree of compatibility with
Windows 3.0. However, if you use the 386 Enhanced Mode of
Windows 3.0, there are some fine points that need clarification:
10.1 Modifying the Windows SYSTEM.INI File
On a 386 or 386sx with Windows 3.0 running in 386 enhanced mode,
LASTBYTE and WINDOWS will both try to use the high memory area
between 640k-1M, thus creating a conflict. To avoid the
conflict, you must ask WINDOWS not to use this region. This can
be done with a configuration option in the [386Enh] section of
the Windows SYSTEM.INI file:
EMMExclude=A000-FFFF
If you have used the "EXCLUDE" option of LASTBYTE.SYS to disable
any region of the high memory, then Windows may be told it is ok
to use that area. For example, if LASTBYTE is loaded using the
line:
DEVICE=LASTBYTE.SYS EXCLUDE=D000:64
then you may use the following configuration option (in addition
to the EMMExclude option above) in your SYSTEM.INI file:
EMMInclude=D000-DFFF
The EMMInclude option will take precedence over the EMMExclude
option when the two overlap, as above.
10.2 HIGHMEM and Windows 386 Enhanced Mode
DOS applications (such as HIGHMEM) run from inside Windows 3.0
are given their own "virtual" address space of 640k. Windows
tells the 386 processor to map memory references in this space
to the particular 640k of physical memory which has been
allocated to the application. References outside this range are
considered invalid and thus return garbage. Since HIGHMEM is a
program that inspects memory between 640k-1M, there's no way it
can execute properly in this context. Outside of Windows, and
in any mode other than 386 Enhanced Mode, HIGHMEM will behave
normally.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 13
10.3 HIGHDISK and Windows 386 Enhanced Mode
HIGHDISK.SYS also uses memory in the 640k-1M range and so is
susceptible to the same problems that HIGHMEM experiences as
discussed above in Section 10.2. Outside of Windows, and in any
mode other than 386 Enhanced Mode, HIGHDISK will behave
normally.
_1_1_.__U_s_i_n_g__t_h_e__D_O_S_=_F_0_0_0_:_3_2__O_p_t_i_o_n__w_i_t_h__A_M_I__B_i_o_s__C_h_i_p_s_
The 64k region starting at paragraph address F000 is the Bios
ROM. Many of the popular 286, 386, and 386sx clones use a Bios
ROM developed by AMI. The more recent versions of these ROMs
devote the first 32k to initialization code that is only used
during the boot sequence, and use the second 32k for that
portion that must remain available at all times.
By the time your PC gets to the point in its boot sequence where
it is setting up the device drivers (e.g., when it is installing
LASTBYTE.SYS), the Bios initialization code is no longer
needed. If you have one of these AMI Bios chips, you can
capture another 32k of high memory by using a DOS=F000:32 option
(see Section 3, "Command Line Options For LASTBYTE.SYS").
Of course, whenever you press Ctrl-Alt-Del to do a warm boot,
the ROM Bios initialization code needs to be executed again!
And that could be a problem since you've effectively disabled it
with the DOS=F000:32 option! Fortunately, LASTBYTE.SYS
intercepts all keyboard input and keeps an eye out for
Ctrl-Alt-Del. When it sees the warm boot request, it will force
a COLD BOOT if you've used the DOS=F000:32 option. This
re-enables the entire 64k Bios ROM so that the initialization
code is reactivated before the processor tries to execute it.
Otherwise a normal warm boot is used.
Keyboard TSRs
Some TSRs intercept the keyboard hardware interrupt 9,
and will jump directly into a fixed location in the
Bios ROM where the Warm Boot code begins.
Unfortunately, this will bypass LASTBYTE's attempt to
turn the ROM back on.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 14
_1_2_.__V_i_d_e_o__D_i_s_p_l_a_y__R_A_M__a_b_o_v_e__6_4_0_k____
In general, the region A0000-BFFFF is the video display buffer
area. Various display adapters (MDA, Hercules, CGA, EGA, and
VGA) typically use only a small subset of this space. LASTBYTE
automatically senses what kind of video display adapter is
installed and reserves that portion of this address space that
might POTENTIALLY be used by the adapter. You can determine
where these areas are with the HIGHMEM command or with the "?"
option on the command line of LASTBYTE.SYS.
Theoretically, neither the EGA or VGA should use the 32k
monochrome region (B0000-B7FFF), and only use the 64k graphics
buffer (A0000-AFFFF) in high-resolution graphics modes.
However, the ROM Bios of a few EGA or VGA adapters have been
known to write into one or more of these areas even if they
aren't in monochrome or graphics mode. Thus when LASTBYTE
detects an EGA or VGA adapter, it reserves the entire 128k
display buffer between A0000-BFFFF.
If a Hercules adapter is found, LASTBYTE reserves the entire 64k
range B0000-BFFFF as Bank-Switch memory in case Hercules
graphics modes are used although only the first 4k of this space
is used for text modes.
Like the text-only mode of a Hercules card, an MDA adapter
should use only the 4k range B0000-B0FFF, and clearing the
screen with a DOS "CLS" command should erase the screen by
writing (only) in this region. However, the ROM BIOS on some
clones assumes that the MDA display buffer fills a larger (16k)
region between B0000-B3FFF and may write into memory beyond the
first 4k.
Similarly, the four video text pages of the CGA, EGA, and VGA
adapters occupy only the 16k range B8000-BBFFF, but some
software will write to the second 16k between BC000-BFFFF.
Therefore, if any (monochrome) Display Buffer RAM is found at
B0000, LASTBYTE reserves the entire 32k range B0000-B7FFF. If
any (CGA, EGA or VGA) Display Buffer RAM is found at B8000,
LASTBYTE reserves the entire 32k range B8000-BFFFF.
You may choose to override these rather conservative defaults
with the "DOS=" command line option as described below. In
addition to the constraints imposed by your particular video
display adapter, the 16k resolution of the Chips and
Technologies memory controller limit what you can do. For more
information, review the discussion in Section 3, "Command Line
Options For LASTBYTE.SYS".
The following chart summarizes the conservative approach taken
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 15
by LASTBYTE as well as what "DOS=" options you may be able to
use:
Display Reserved "DOS=" "APPEND="
Adapter by default Options Options
------- ----------- -------- ---------
Monochrome B0000-B7FFF A000:64 or A000:64
B400:16 and A000:64
Hercules B0000-BFFFF A000:64 or A000:64
B400:48 (1) and A000:64
CGA B8000-BFFFF A000:96 or A000:96
BC00:16 (2) and A000:96
EGA and VGA A0000-BFFFF A000:64 (1) or A000:96
B000:32 and A000:64
BC00:16 (2,3) and A000:96
VGA Bios Rom C0000-C7FFF C600:8 (4)
Notes: (1) Cannot be used with graphics modes.
(2) WINDOWS 3.0 may write in this area!
(3) May be combined with DOS=B000:32.
(4) See section 13, "Video Adapter Bios ROMs"
_1_3_.__V_i_d_e_o__A_d_a_p_t_e_r__B_i_o_s__R_O_M_s_____
MDA and CGA use the standard ROM Bios; they have no ROM of their
own. Hercules, EGA, and VGA adapters, however, incorporate
their own ROM Bios chip right on the adapter card. LASTBYTE
successfully recognizes these ROMs, but has to treat VGA in a
special manner:
The VGA adapter made by IBM has a 24k ROM installed at
C0000-C5FFF, which means that the 8k at C6000-C7FFF should be
usable. Although almost all VGA clones have a ROM signature
that indicates 24k, many of them use the C6000-C7FFF space for
ROM Bios or RAM extensions that provide their "Super VGA"
features. In particular, the Video7 and Paradise VGA's
incorporate their own RAM from C6000-C7FFF. For this reason,
when LASTBYTE finds anybody's VGA adapter, it automatically
assumes that there is a 32k ROM at C0000-C7FFF.
_1_4_.__H_I_G_H_A_P_N_D_:__S_t_r_e_t_c_h_i_n_g__C_o_n_v_e_n_t_i_o_n_a_l__M_e_m_o_r_y__b_e_y_o_n_d__6_4_0_k___
HIGHAPND.EXE is a program that can only be used in conjunction
with the "APPEND=" option of LASTBYTE.SYS. HIGHAPND.SYS is a
device driver version of HIGHAPND.EXE. Either can be used to
append some of the memory that begins at 640k onto the end of
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 16
DOS Conventional (low) memory (and also to return later to
640k).
Monochrome (MDA), Hercules, and CGA display adapters don't use
the 64k region starting at A000, and so this memory can be used
to extend conventional memory from 640k to 704k. CGA display
adapters also don't use the next 32k either, and so CGA users
may extend conventional memory all the way to 736k.
EGA and VGA display adapters have a 64k hi-resolution graphics
display buffer that is located at A000. This buffer is only
needed when you are using only hi-resolution graphics. When the
display is in either text or low-resolution CGA graphics modes,
this memory is not used, and may be used to extend conventional
memory. Since most EGA and VGA adapters usually don't use the
32k region at B000, you may even be able to extend conventional
memory up to 736k.
HIGHAPND will automatically disable any EGA or VGA hi-resolution
graphics capability whenever conventional memory has been
extended beyond 640k. This makes software that attempts to
sense what type of display adapter is installed think that you
have only a CGA adapter. Later, when you need the graphics
capability, you can disable the memory extension and
hi-resolution graphics will be automatically re-enabled.
HIGHAPND.SYS can be used during CONFIG.SYS processing:
DEVICE=HIGHAPND.SYS ON {Extends conv. memory beyond 640k}
DEVICE=HIGHAPND.SYS OFF {Resets conv. memory to 640k}
Note: HIGHAPND.SYS may not work properly with some versions
of DOS; in such cases, use HIGHAPND.EXE instead.
or HIGHAPND.EXE can be used during AUTOEXEC.BAT processing or at
any time after the computer is booted:
A>HIGHAPND ON {Extends conv. memory beyond 640k}
A>HIGHAPND OFF {Resets conv. memory to 640k}
Note: HIGHAPND.EXE may not work properly with DR DOS;
in such cases, use HIGHAPND.SYS instead.
HIGHAPND (or HIGHMEM) can be used without any command line
options to determine the current size of conventional memory and
the state of EGA/VGA hi-resolution graphics:
A>HIGHAPND
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 17
You can put these commands into a batch file to simplify
switching back and forth. For example, if you want the extra
memory all the time except when you need hi-res graphics for
WINDOWS, create a batch file like the following to run windows:
@ECHO OFF
HIGHAPND OFF
WIN %1 %2
HIGHAPND ON
If you have hi-res graphics disabled and run a program that
tries to use hi-res graphics without first sensing for an EGA or
VGA adapter, LASTBYTE will notice the conflict, issue an error
message, and terminate the program. Some programs redirect a
few interrupts during their initialization and then restore them
before termination. LASTBYTE's termination of graphics programs
doesn't know how to restore these interrupts, so in some cases
you may have to reboot the computer. In other words, if you
experience this kind of program termination with an application
program, it's best to prepare a batch file (as shown above) to
run the program.
Notes
o The use of HIGHAPND.EXE requires the use of an
APPEND=A000:?? option on the LASTBYTE command
line.
o There is no benefit to using HIGHDRVR.SYS to load
HIGHAPND.SYS into high memory because it never
stays resident.
_1_5_.__U_s_i_n_g__T_h_e__L_a_s_t__B_y_t_e__w_i_t_h__E_x_p_a_n_d_e_d__M_e_m_o_r_y__
Expanded memory always has an associated device driver. If that
driver is loaded before LASTBYTE.SYS in the CONFIG.SYS file (and
if the hardware is enabled) LASTBYTE will recognize the 64k EMM
Page Frame of the expanded memory and do the right thing: It
will treat the Page Frame like any other Adapter Ram and disable
the motherboard RAM that falls in the same address space so that
it doesn't interfere with the Page Frame. For example, if the
EMM driver is loaded first (as described above), LASTBYTE will
report the 64k EMM Page Frame as "EMS Page Frame".
This works fine, of course, but loading the EMM driver first
precludes the possibility of loading it into High Memory. To
get the EMM driver in to High Memory means that it must be
loaded after LASTBYTE.SYS, but you must be careful!
If LASTBYTE.SYS is loaded first, the Page Frame will be
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 18
recognized only in two cases: (1) The Page Frame used by the
Expanded Memory controller built into the Chips and Technologies
NEAT chipsets will be recognized and reported as "EMS Page
Frame". (2) The Page Frame of a REAL expanded memory board is
(if enabled) recognized and reported as "Adapter RAM". In
either case, LASTBYTE will not use that memory space.
Recognizing EMS Boards
Some EMS boards must be enabled by their device driver
before they respond as read/write memory. This
prevents LASTBYTE from recognizing them, and you will
have to use a "BSW=" option to keep LASTBYTE from
using the Page Frame memory space.
If you don't have an expanded memory board, but have used a
device driver (like EMM386.SYS) that EMULATES expanded memory
using extended memory, then LASTBYTE.SYS will not know about the
page frame unless the emulator is loaded first. If LASTBYTE.SYS
is loaded first, then you must use a "EXCLUDE=" (not "BSW="!)
command line option of LASTBYTE.SYS to reserve a 64k region
where the emulated Page Frame can be placed. (Do NOT use a
corresponding EMMInclude option in the SYSTEM.INI file.) For
EMM386.SYS, this 64k region must lie at C000, C400, C800, CC00,
D000, D400, D800, DC00, or E000.
_1_6_.__H_I_G_H_E_M_S_:__E_m_u_l_a_t_i_n_g__E_x_p_a_n_d_e_d__M_e_m_o_r_y__w_/_B_a_n_k_-_S_w_i_t_c_h__M_e_m_o_r_y___
Two Expanded Memory Emulators are provided with LASTBYTE. Both
use high memory as Expanded Memory. HIGHEMS3.SYS is compliant
with the older LIM 3.2 spec, and HIGHEMS4.SYS with the newer LIM
4.0 spec. Both are included since the HIGHEMS3.SYS requires
much less memory for the device driver itself than
HIGHEMS4.SYS. In many applications, you may find that 3.2 is
all you need.
These device drivers EMULATE Expanded Memory! That means that
they use software to copy data back and forth between the
logical EMS memory (pages) and the Page Frame. Obviously, this
is MUCH slower than the performance you would realize with
hardware support, or even with EMM386.SYS. Therefore, these
device drivers are provided for those who have no other way of
providing EMS memory to their applications, such as users with
only 1Meg of memory.
Both HIGHEMS3.SYS and HIGHEMS4.SYS have an optional command line
parameter which is the number of 16k EMS pages to allocate. If
omitted, the maximum allocation will be used. Bank-Switch
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 19
Memory is allocated first, and if that isn't enough, then other
High Memory is allocated to satisfy the total page request.
Use only one of these device drivers, and load it AFTER
LASTBYTE.SYS. The driver itself may be loaded into high memory
using HIGHDRVR.SYS.
Suggestion
On a machine with no expanded memory, you might want
to use HIGHEMS3 to provide some Expanded Memory for
Charles Lazo's scroll-back TSR, WAS.COM. This utility
saves lines of text that have been scrolled off the
top of the screen and allows you to pull them back
down for review. WAS is available from a number of
BBS's, usually under the filename WAS050.ZIP or
WAS050.ARC.
_1_7_.__F_i_n_e_-_T_u_n_i_n_g__y_o_u_r__A_d_a_p_t_e_r__H_a_r_d_w_a_r_e__C_o_n_f_i_g_u_r_a_t_i_o_n____
Many adapter cards occupy some portion of the 640k-1Meg address
space. Some of these cards, such as SCSI Disk Controllers,
often have DIP switches or jumpers that can be used to set the
address space they occupy to one of a few chioces.
If the memory map displayed by HIGHMEM is fragmented because one
of these adapters sits between two "....DOS Free" areas, you may
want to try to reposition the address space occupied by that
adapter by modifying the DIP switch or jumper settings on the
card.
Having one large free memory block is better than two smaller
ones because TSR's and device drivers almost always require more
memory during initialization than once installed. In other
words, neither of the two smaller blocks may be large enough for
the installation, but might if they were combined.
_1_8_.__U_s_i_n_g__H_I_G_H_U_M_M_._S_Y_S__w_i_t_h__4_D_O_S_____
4DOS is a shareware replacement for COMMAND.COM. HIGHUMM.SYS
may be used in conjunction with the DOS device driver HIMEM.SYS
to move the 4DOS command processor and its master environment
into "Upper Memory Blocks" (UMB's) between 640k and 1M, thus
reducing the amount of conventional memory below 640k used by
4DOS from 3.4k bytes to 256 bytes.
First you must be sure that your CONFIG.SYS file contains the
following three lines:
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 20
DEVICE=LASTBYTE.SYS {and any LASTBYTE options}
DEVICE=HIGHDRVR.SYS HIMEM.SYS {and any HIMEM options}
DEVICE=HIGHDRVR.SYS HIGHUMM.SYS
Then you must add a "SHELL=" line to CONFIG.SYS for 4DOS,
including the options "/U" (to place the command processor in an
UMB) and "/E:512U" (to place the master environment in an UMB).
The value "512" is of course only an example - other environment
sizes may be specified. You may also want to specify these
options for secondary shells in the 4DSHELL environment
variable. Consult the 4DOS documentation for further details.
4DOS may be downloaded from The Future Technology BBS at (617)
720-3600.
_1_9_.__H_I_G_H_B_F_R_S_:__L_o_a_d_i_n_g__D_O_S__B_u_f_f_e_r_s__i_n_t_o__H_i_g_h__M_e_m_o_r_y__
NOTE: HIGHBFRS *ONLY* works for DOS 3.xx. It does *NOT* work
for DOS 4.
╔═════════════════════════════════════════════════╗
║ WARNING! PLACING DOS BUFFERS IN HIGH MEMORY ║
║ CAN RESULT IN THE LOSS OF DATA. I.E., IT CAN ║
║ DAMAGE THE DIRECTORY AND FILE ALLOCATION TABLES ║
║ OF YOUR DISK. READ EVERYTHING IN THIS SECTION ║
║ BEFORE CONSIDERING THE USE OF THIS UTILITY. ║
╚═════════════════════════════════════════════════╝
Some 16-bit adapter cards do not properly decode the address
lines within the narrow time constraints imposed by the Address
Latch Enable (ALE) signal. As a result, such cards will
occassionally respond to a memory access that is directed at
some other portion of the address space. Thinking that it is
for them, they force the transfer into 16-bit mode even though
the intended recipient requires 8-bit mode, and thus cause
erroneous data to be transferred to the bytes in the
odd-numbered addresses. The most common and damaging occurence
occurs during the 8-bit DMA transfers between a floppy disk
drive and high memory near the address space occupied by an
offending 16-bit adapter card. Due to organization of the
address signals on the AT bus, this phenomena only occurs when
the two address areas are within the same 128k region. There
are three such regions in the high memory area: A0000-BFFFF,
C0000-DFFFF, and E0000-FFFFF.
Evidence of this hardware problem has been exhibited by other
memory managers that also offer software to locate DOS buffers
in high memory. The problem is NOT unique to LASTBYTE.
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 21
HIGHBFRS offers two solutions to this problem. The first (and
preferred solution) is to restrict the placement of DOS buffers
to particular 128k regions in high memory. For example, if you
have an offending 16-bit VGA card, you would want to place the
DOS buffers in only the last 128k region since the VGA display
buffer occupies A0000-AFFFF and B8000-BFFFF and because the VGA
Bios Rom occupies C0000-C7FFF. The corresponding command line
options (explained in more detail later) would be:
HIGHBFRS A000-BFFF=0 C000-DFFF=0 BUFFERS=20
If you have 16-bit adapter cards in all three 128k segments,
then a second (different) solution may be both necessary and
sufficient. It intercepts transfers between floppy disk drives
(an 8-bit DMA interface) and high memory, and redirects the
transfer through an intermediate sector buffer in conventional
(low) memory. Almost all hard disk controllers use 16-bit CPU
instructions to transfer data and thus do not incur the
problem. The corresponding command line options would be:
HIGHBFRS FLOPPY=1 BUFFERS=20
To use HIGHBFRS, you MUST set "BUFFERS=1" in your CONFIG.SYS
file. This one buffer in Conventional (low) memory is required
by the FLOPPY option as the intermediate buffer for transfers
between floppy disk drives and high memory.
The command line options of HIGHBFRS are as follows:
BUFFERS=<number> (Abbreviated "B=<number>")
Changes the number of DOS buffers to the value
specified. (Note: "<number>" is a number from
1-99.)
BUFFERS=MAXIMUM (Abbreviated "B=M")
Changes the number of DOS buffers to the maximum
permitted by the amount of available unrestricted
memory, but no more than the DOS limit of 99.
FLOPPY=<switch> (Abbreviated "F=<switch>")
Enables (1) or disables (0) redirection of Bios
INT 13h calls that attempt to transfer data
between a floppy disk drive and high memory. If
redirected, such transfers go through an
intermediate buffer located in Conventional (low)
memory. (Note: "<switch>" is either 0 or 1.)
Copyright (C) 1990, Key Software Products. All Rights Reserved
Oct 24, 1990 The LAST BYTE (tm) 22
A000-BFFF=<switch> (Abbreviated "A=<switch>")
C000-DFFF=<switch> (Abbreviated "C=<switch>")
E000-FFFF=<switch> (Abbreviated "E=<switch>")
where "<switch>" is 0 or 1. Enables (1) or
disables (0) the placement of DOS buffers in the
corresponding 128k region of the high memory
address space.
All of these are optional, may be combined at random, and may be
abbreviated by their first letter (e.g., A=<switch> instead of
A000-BFFF=<switch>). The first time you run HIGHBFRS, all the
options default to 1 unless overridden by command line
arguments. Each successive time HIGHBFRS is run, the defaults
are whatever the last setting of each option happens to be.
When HIGHBFRS is invoked with no command line arguments, it
simply reports the number of DOS buffers presently located in
High Memory and whether or not transfers between floppy disk
drives and high memory are redirected. You may use the HIGHMEM
program to determine where the buffers have been placed in high
memory.
MicroSoft recommends setting the "BUFFERS=" option in CONFIG.SYS
according to the type of application most frequently used.
Implicit within this recommendation is the assumption that you
won't change the value very often since it requires editing
CONFIG.SYS and rebooting.
However, since HIGHBFRS allows you to increase or decrease the
number of buffers dynamically, you could create some batch files
to invoke your applications with the optimum number.
In general, more buffers help when running programs that perform
random access on a relatively small number of disk records (such
as the index for a database program), or if your disk has many
subdirectories organized on several levels.
Copyright (C) 1990, Key Software Products. All Rights Reserved
The LAST BYTE (tm)
Table of Contents
1. Introduction .................................... 1
2. Installation .................................... 2
3. Command Line Options For LASTBYTE.SYS ............... 5
4. HIGHMARK and HIGHUNDO: Unloading TSRs from Memory ..... 7
5. HIGHINST: Loading SHARE.EXE into High Memory ......... 8
6. The /SIZE option of HIGHDRVR HIGHTSR and HIGHINST ...... 9
7. The /NOENV option of HIGHTSR and HIGHINST ............. 10
8. Installing FASTOPEN and MODE into High Memory ......... 10
9. HIGHDISK: A Ram Disk in Bank-Switch Memory ............ 11
10. Windows 3.0 Compatibility ........................ 12
10.1 Modifying the Windows SYSTEM.INI File ......... 12
10.2 HIGHMEM and Windows 386 Enhanced Mode .......... 12
10.3 HIGHDISK and Windows 386 Enhanced Mode ......... 13
11. Using the DOS=F000:32 Option with AMI Bios Chips ...... 13
12. Video Display RAM above 640k ....................... 13
13. Video Adapter Bios ROMs ........................... 15
14. HIGHAPND: Stretching Conventional Memory beyond 640k 15
15. Using The Last Byte with Expanded Memory ............. 17
16. HIGHEMS: Emulating Expanded Memory w/Bank-Switch Memory 18
17. Fine-Tuning your Adapter Hardware Configuration .... 19
18. Using HIGHUMM.SYS with 4DOS ....................... 19
19. HIGHBFRS: Loading DOS Buffers into High Memory ....... 20
Copyright (C) 1990, Key Software Products. All Rights Reserved